/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package DAO;
import DTO.User;
import java.sql.ResultSet;
import java.util.List;
import DTO.CFields;
import DTO.CHistory;
import DTO.CInFoUser;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.logging.Level;
import java.util.logging.Logger;
import DTO.CNhanVien;
import java.util.ArrayList;

public class UserDAO extends IData<User>{
    public UserDAO(){
    }
    @Override
    protected Object OnSubmit(User item, int t, SubConfig config) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    /**
     * Hàm này thực hiện chức năng lấy 1 record được gán cho 1 đối tượng. Mỗi đối tượng sẽ tương ứng với 1 record được đọc lên
     * @param rs Truyền vào một ResultSet tương ứng với dòng csdl
     * @return Trả về một đối tượng tương ứng
     */
    @Override
    protected User getItem(ResultSet rs) {
        User item = new User();
        try {
            item.setGroupUser(rs.getInt(CFields.group_id));
            item.setActive(rs.getBoolean(CFields.active));
            item.setPassword(rs.getString(CFields.password));
            item.setUserName(rs.getString(CFields.user_name));
            item.setId(rs.getLong(CFields.id));
            item.setHoTen(rs.getString(CFields.hoten));
            item.setOrderType(rs.getInt(CFields.order_type));
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return item;
    }
    /**
     * Hàm này lưu danh sách các đối tượng tương ứng với các dòng trong csdl
     * @param config
     * @return Trả về danh sách các đối tượng tương ứng với các dòng trong csdl
     */
    @Override
    public List<User> getAll(SubConfig config) {
        String mysql = "select * from vUser "  + this.sWhere;// thực hiện câu truy vấn...
        return this.getAll(mysql, config);
    }
    /**
     * Thực hiện login khi user đăng nhập vào phần mềm
     * @param username Truyền vào username
     * @param password Truyền vào mật khẩu
     * @param config
     * @return Trả về user tìm thấy. Hoặc trả về null không tồn tại
     */
    public User logIn(String username,String password,SubConfig config){
        List<User> users = getAll(config);
        for(User item : users){
            String _user = item.getUserName().toLowerCase().trim();
            String _pass = item.getPassWord().toLowerCase().trim();
            if(item.getPassWord().equals(password.toLowerCase()) && item.getUserName().equals(username.toLowerCase())){
                CHistory history = new CHistory();
                history.setChuc_nang("Đăng nhập");
                history.setMota(item.toString());
                history.setNguoiTao(item.getUserName());
                List<CHistory> lHis = new ArrayList<CHistory>();
                lHis.add(history);
                CHistoryDAO _dao = new CHistoryDAO();
                _dao.addrows(lHis, config);
                return item;
            }                                
        }
        return null;
    }

    @Override
    public Object insertOnSubmit(User item, SubConfig config) {
       Object result = 0;
       String mysql ="INSERT INTO " + CFields.tb_user  + "("+ CFields.user_name 
               + "," + CFields.password+","+CFields.group_id +"," + CFields.active +") VALUES(?,?,?,?)";
        System.out.println("m " + mysql);
        try {
            PreparedStatement cs = config.connec.prepareStatement(mysql,PreparedStatement.RETURN_GENERATED_KEYS);
            config.connec.setAutoCommit(false);
            cs.setString(1, item.getUserName());
            cs.setString(2, item.getPassWord());
            cs.setLong(3,item.getGroupUser());
            cs.setBoolean(4, item.getActive());
            cs.executeUpdate();
            config.connec.commit();
            ResultSet keyResultSet = cs.getGeneratedKeys();
            if (keyResultSet.next()) {
                result = (long) keyResultSet.getInt(CFields.id);      
            }
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
            if(config.connec!= null){
                try {
                    config.connec.rollback();
                } catch (SQLException ex1) {
                    Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex1);
                }
            }
        }
        finally{
           try {
               config.connec.setAutoCommit(true);
           } catch (SQLException ex) {
               Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
           }
        }
       return result;
    }

    @Override
    public Object updateOnSubmint(User item, SubConfig config) {
       Object result = 0;
       String mysql ="update " + CFields.tb_user + " set " + CFields.password + "=?,"
               + CFields.active+"=?,"+ CFields.group_id+"=? where id=?";
        System.out.println("m " + mysql);
        try {
            PreparedStatement cs = config.connec.prepareStatement(mysql);
            cs.setString(1, item.getPassWord());
            cs.setBoolean(2, item.getActive());
            cs.setLong(3,item.getGroupUser());
            cs.setLong(4,item.getId());
            result = cs.executeUpdate();                       
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
            
        }
       return result;
    }

    @Override
    public Object deleteOnSubmint(User item, SubConfig config) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

    @Override
    public User Find(User item, List<User> list) {
        User iFind = null;
        for(User k : list){
            if(k.getUserName() == item.getUserName() && k.getPassWord() == item.getPassWord()){
                iFind = k;
                break;
            }
        }
        return iFind;
    }

/**
 * Hàm này có chức năng add từng item vào ps để thực hiện ghi nhiều dòng xuống csdl
 * @param item Đối tượng tương ứng được lưu xuống dữ liệu
 * @param t 
 */
    @Override
    protected void add(User item,int t) {
        //danh sách các tham số tương ứng với query
        try {
            ps.setString(1, item.getPassWord());// 
            ps.setBoolean(2, item.getActive());
            ps.setLong(3,item.getGroupUser());
            ps.setLong(4,item.getId());
            // Nếu là chức năng update thì t = 1
            if(t == 1){
                ps.setLong(5, item.getId());
            }
            ps.addBatch();
            
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
        }        
    }

    @Override
    public void saveBatch() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
/**
 * 
 * @param list Truyền vào danh sách user cần insert
 * @param config
 * @return Trả về số dòng được ghi
 */
    @Override
    public int addrows(List<User> list, SubConfig config) {
        String mysql ="INSERT INTO " + CFields.tb_user  + "("+ CFields.user_name 
               + "," + CFields.password+","+CFields.group_id +"," + CFields.active +") VALUES(?,?,?,?)";
        int rs = 0;
        try {
            ps = config.connec.prepareStatement(mysql);
            for(User item : list){
                this.add(item);
            }
           int []n = ps.executeBatch();
           rs = n.length;
            ps.close();
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
             if(config.connec!= null){
                try {
                    config.connec.rollback();
                } catch (SQLException ex1) {
                    Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex1);
                }
            }
        }
        return rs;
    }
    /**
     * 
     * @param user_id Truyền vào user_id để lấy tên nhân viên
     * @param config
     * @return 
     */
    public String tenNhanVien(long user_id,SubConfig config){
        String str ="";
        CNhanVienDAO nvdao = new CNhanVienDAO();
        List<CNhanVien> list = nvdao.getAll(config);
        for(CNhanVien nv : list){
            if(nv.getUserId() == user_id){
                return nv.getHoTen();
            }
        }
        return str;
    }
    
    public User Login(String passWord,String userName,SubConfig config){
        //".bat"
        List<User> list = this.getAll(config);
        for(User _user : list){
            if(_user.getPassWord().equals(passWord) && _user.getUserName().equals(userName)){                
                return _user;
            }
        }
        return null;
    }
    /**
     * 
     * @param pass Truyền vào mật khẩu cần thay đổi
     * @param user_id Truyền vào user_id để thay đổi mật khẩu cho user đó
     * @param config
     * @return Trả về true thay đổi thành công. Ngược lại là flase thay đổi thất bại
     */
    public Boolean ChangePass(String pass,long user_id,SubConfig config){
        try {
            String mysql ="update " + CFields.tb_user + " set pass_word=? where id =?";
            PreparedStatement cs = config.connec.prepareStatement(mysql);
            cs.setString(1, pass);
            cs.setLong(2, user_id);
            int t = cs.executeUpdate(); 
            if(t == 1)
                return true;
        } catch (SQLException ex) {
            Logger.getLogger(UserDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return false;
    }
    @Override
    public User add(User item) {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}
